package cn.smile.utils;

import cn.smile.bean.dto.basic.ExpenseItemDTO;
import cn.smile.commons.constant.NumberConstant;
import cn.smile.commons.enums.basic.VoucherStatusEnum;
import org.springframework.util.ObjectUtils;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.Map;

public class VoucherUtil {

    /**
     * 获取代金券有效状态
     *
     * @param startDay 代金券开始时间
     * @param endDay   代金券结束时间
     * @return 状态枚举
     */
    public static VoucherStatusEnum getStatus(LocalDate startDay, LocalDate endDay) {
        Date now = new Date();
        Date formStart = DateFormatUtil.localDateToDate(startDay);
        Date formEnd = DateFormatUtil.localDateToDate(endDay);
        Date nowStart = DateFormatUtil.parseStrToDate(DateFormatUtil.parseDateToStr(now, DateFormatUtil.TO_DATE_START), DateFormatUtil.DATE_TIME_FORMAT_1);
        Date nowEnd = DateFormatUtil.parseStrToDate(DateFormatUtil.parseDateToStr(now, DateFormatUtil.TO_DATE_END), DateFormatUtil.DATE_TIME_FORMAT_1);
        VoucherStatusEnum statusEnum = VoucherStatusEnum.NOT_ACTIVATED;
        formStart = DateFormatUtil.parseStrToDate(DateFormatUtil.parseDateToStr(formStart, DateFormatUtil.TO_DATE_START), DateFormatUtil.DATE_TIME_FORMAT_1);
        if (formStart.compareTo(nowStart) <= NumberConstant.ZERO) {
            statusEnum = VoucherStatusEnum.IN_EFFECT;
        }
        formEnd = DateFormatUtil.parseStrToDate(DateFormatUtil.parseDateToStr(formEnd, DateFormatUtil.TO_DATE_END), DateFormatUtil.DATE_TIME_FORMAT_1);
        if (formEnd.compareTo(nowEnd) < NumberConstant.ZERO) {
            statusEnum = VoucherStatusEnum.EXPIRED;
        }
        return statusEnum;
    }

    /**
     * 会员代金券状态
     *
     * @param startDay 代金券开始时间
     * @param endDay   代金券结束时间
     * @param useTime  代金券使用时间
     * @return 会员代金券状态
     */
    public static VoucherStatusEnum getStatusByMember(LocalDate startDay, LocalDate endDay, LocalDateTime useTime) {
        VoucherStatusEnum status;
        if (ObjectUtils.isEmpty(useTime)) {
            status = getStatus(startDay, endDay);
            if (VoucherStatusEnum.IN_EFFECT == status) {
                status = VoucherStatusEnum.UN_USE;
            }
        } else {
            status = VoucherStatusEnum.USE;
        }
        return status;
    }

    /**
     * 组装代金券可用范围名称
     *
     * @param itemIds 可用项目ID集合
     * @param itemMap 项目集合
     * @return 可用范围名称字符串
     */
    public static String getItemNames(List<String> itemIds, Map<String, ExpenseItemDTO> itemMap) {
        StringBuilder itemName = new StringBuilder();
        int index = NumberConstant.ZERO;
        for (String itemId : itemIds) {
            index++;
            if (itemMap.containsKey(itemId)) {
                ExpenseItemDTO item = itemMap.get(itemId);
                itemName.append(item.getItemName());
                if (index != itemIds.size()) {
                    itemName.append(", ");
                }
            }
        }
        return itemName.toString();
    }
}
